#!/bin/sh
# 
#  Copyright (c) 1998-2000
#   Sergey A. Babkin.  All rights reserved.
# 
#  Redistribution and use in source and binary forms, with or without
#  modification, are permitted provided that the following conditions
#  are met:
#  1. Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
#  2. Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
# 
#  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
#  WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
# 
#  Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net)
# 

# Use : convert [cfgfile]

# Convert TTF fonts from source directory to Type1 fonts in the destination
# directory, converted to the specified encodings. Also generate the
# fonts.scale, fonts.dir and fonts.alias files in the destination directory.

# clean some variables so that they won't be inherited from environment

ENCDIR=
MAPDIR=

# path to the configuration file

if [ $# -eq 1 ]
then
	CFGFILE=$1
else
	CFGFILE=`pwd`/convert.cfg
fi

# these setting would be edited during installation

TTF2PT1_BINDIR=
TTF2PT1_LIBXDIR=
TTF2PT1_SHAREDIR=

[ -z "$TTF2PT1_BINDIR" ] && {
	TTF2PT1_BINDIR=`pwd`/..
}
[ -z "$TTF2PT1_LIBXDIR" ] && {
	TTF2PT1_LIBXDIR=`pwd`/..
}
[ -z "$TTF2PT1_SHAREDIR" ] && {
	TTF2PT1_SHAREDIR=`pwd`/..
}

# directory from where we are started

RUNDIR=`pwd`

# paths to various utilities

T1ASM=$TTF2PT1_LIBXDIR/t1asm
[ -f $T1ASM -a -x $T1ASM ] || {
	# if it's not in libxdir, use whatever t1asm the system provides
	T1ASM=t1asm
}
TTF2PT1=$TTF2PT1_BINDIR/ttf2pt1
TRANS=$TTF2PT1_SHAREDIR/scripts/trans
T1FDIR=$TTF2PT1_SHAREDIR/scripts/t1fdir
FORCEISO=$TTF2PT1_SHAREDIR/scripts/forceiso
X2GS=$TTF2PT1_SHAREDIR/scripts/x2gs
SUFFIX="pfa"

MYSELF=convert

# include the configuration

if [ -r $CFGFILE ] 
then {
	. $CFGFILE
} else {
	echo "
Can't find the configuration file 
   $CFGFILE
Please look at the sample file convert.cfg.sample,
copy it to convert.cfg and modify for
you actual configuration." >&2
	exit 1
} fi

# path to the directory with descriptions of encodings
[ -z "$ENCDIR" ] && {
	ENCDIR=$TTF2PT1_SHAREDIR/encodings
}

# directory with the external Unicode maps
[ -z "$MAPDIR" ] && {
	MAPDIR=$TTF2PT1_SHAREDIR/maps
}

LOG=$DSTDIR/convert.log

# configure the ttf2pt1 options from our options

# artefact of backwards-compatibility with .cfg
[ -z "$CORRECTWIDTH" -a YES != "$DONTCORRECTWIDTH" ] && {
	TTF2PT1="$TTF2PT1 -OW"
}
[ YES = "$CORRECTWIDTH" ] && {
	TTF2PT1="$TTF2PT1 -OW"
}

[ YES != "$HINTSUBST" ] && {
	TTF2PT1="$TTF2PT1 -Ou" # meaning changed past 3.22
}

[ YES = "$ALLGLYPHS" -a YES = "$ENFORCEISO" ] && {
	echo "$MYSELF: options ALLGLYPHS and ENFORCEISO are mutually exclusive" >&2
	exit 1
}

[ YES = "$ALLGLYPHS" ] && {
	TTF2PT1="$TTF2PT1 -a"
}

[ YES = "$GENUID" ] && {
	TTF2PT1="$TTF2PT1 -uA"
}

[ YES != "$ENFORCEISO" ] && {
	FORCEISO=cat
}

[ YES = "$CREATEPFB" ] && {
	T1ASM="$T1ASM -b"
	SUFFIX="pfb"
}

# parse the information about the source files

eval "`echo \"$SRCDIRS\" | awk '
	BEGIN	{ n=0; }
	/^ *$/	{ next; }
		{ 
			if(n>9) { 
				printf(\"echo \\\"Only 9 encodings are supported at once!\\\" >&2\n\");
				printf(\"exit 1\\n\");
			} else {
				printf(\"SRCDIR%d=%s\n\",n,$1);
				printf(\"SRCLANG%d=%s\n\",n,$2);
				printf(\"SRCENC%d=%s\n\",n,$3);
				printf(\"SRCMAP%d=%s\n\",n,$4);
				n++;
			}
		}'`"

# check whether we have the directories

mkdir $DSTDIR 2>/dev/null >/dev/null
[ -d $DSTDIR -a -r $DSTDIR -a -w $DSTDIR -a -x $DSTDIR ] || {
	echo "$MYSELF: can't access the directory $DSTDIR" >&2
	exit 1
}

# go to our destination directory

cd $DSTDIR || {
	echo "$MYSELF: can't chdir to $DSTDIR" >&2
	exit 1
}

rm -f ./* 2>/dev/null
>$LOG

for dirno in 0 1 2 3 4 5 6 7 8 9
do {
	
	SRCDIR=`eval "echo \\\$SRCDIR$dirno"`
	SRCLANG=`eval "echo \\\$SRCLANG$dirno"`
	SRCENC=`eval "echo \\\$SRCENC$dirno"`
	SRCMAP=`eval "echo \\\$SRCMAP$dirno"`
	DSTENC=`eval "echo \\\$DSTENC$SRCLANG"`

	echo $SRCDIR
	echo $SRCENC

	[ -z "$SRCDIR" ] && break;

	[ "`ls $SRCDIR/*.[tT][tT][fF] 2>/dev/null |wc -l`" -gt 0 ] || {
		echo "$MYSELF: no TTF files in $SRCDIR" >&2
		exit 1
	}

	# check whether we have the encoding tables

	[ -n "$SRCENC" ] || {
		echo "$MYSELF: you must specify some source encoding" >&2
		exit 1
	}

	[ unknown = "$SRCLANG" -o -n "$DSTENC" ] || {
		echo "$MYSELF: you must specify some destination encodings" >&2
		exit 1
	}

	# handle aliases of the destination encodings

	XDSTENC=
	DSTALIAS=

	[ -r $ENCDIR/$SRCLANG/encodings.alias ] && {
		for i in $DSTENC
		do {
			TO=`awk  '$1=="'$i'" { print $2; }' <$ENCDIR/$SRCLANG/encodings.alias`
			if [ -n "$TO" ]
			then {
				[ -f $ENCDIR/$SRCLANG/$i.tbl -a -r $ENCDIR/$SRCLANG/$i.tbl ] && {
					echo "WARNING: $SRCLANG encoding $i found as both table and alias" >&2
					echo "WARNING: The alias takes precedence" >&2
				}
				DSTALIAS="$TO $i
$DSTALIAS"
				XDSTENC="$TO
$XDSTENC"
			} else {
				XDSTENC="$i
$XDSTENC"
			} fi
		} done
		DSTENC=`echo "$XDSTENC" | sort -u | tr '
' ' '`
	}

	[ unknown != "$SRCLANG" ] && {
		for i in $SRCENC $DSTENC
		do {
			[ -f $ENCDIR/$SRCLANG/$i.tbl -a -r $ENCDIR/$SRCLANG/$i.tbl ] || {
				echo "$MYSELF: can't read $ENCDIR/$SRCLANG/$i.tbl" >&2
				exit 1
			}
		} done
	}

	# OK convert the files

	for file in $SRCDIR/*.[tT][tT][fF]
	do {
		name=`echo $file | tr A-Z a-z`
		name=`basename $name .ttf`

		echo "Converting $name"

		# generate the assembler code

		echo "******* $name -> t1a ************" >>$LOG
		
		if [ -n "$SRCMAP" ]
		then {
			$TTF2PT1 -L $MAPDIR/$SRCMAP $file ./$name.$SRCENC 2>>$LOG
		} else {
			$TTF2PT1 -l $SRCLANG $file ./$name.$SRCENC 2>>$LOG
		} fi

		[ -s ./$name.$SRCENC.t1a ] || {
			echo "$MYSELF: can't generate Type1 assembler code for $name" >&2
			continue;
		}

		[ -s ./$name.$SRCENC.afm ] || {
			echo "$MYSELF: can't generate AFM metrics file for $name" >&2
			continue;
		}

		mv ./$name.$SRCENC.afm ./$name.$SRCENC.xafm

		psname=`$T1FDIR -g $FOUNDRY " " -f ./$name.$SRCENC.t1a \
			| awk '{print substr($1,2);}'`

		# now for each destination encoding generate a .pfa/b file
		# and record for fonts.scale

		if [ unknown != "$SRCLANG" ]
		then {
			for enc in $DSTENC
			do {
				echo "******* $name -> $enc ************" >>$LOG

				sed 's|^\/FontName.*$|/FontName /'$psname$enc' def|' <./$name.$SRCENC.t1a \
					| $TRANS $ENCDIR/$SRCLANG/$SRCENC.tbl $ENCDIR/$SRCLANG/$enc.tbl \
					| $FORCEISO | $T1ASM >./$name.$enc.$SUFFIX
				[ -s ./$name.$enc.$SUFFIX ] || {
					echo "$MYSELF: can't convert/assemble Type1 file for $name.$enc" >&2
					continue;
				}

				sed 's|^FontName.*$|FontName '$psname$enc'|' <./$name.$SRCENC.xafm \
					| $TRANS $ENCDIR/$SRCLANG/$SRCENC.tbl $ENCDIR/$SRCLANG/$enc.tbl \
					| uniq | $FORCEISO >./$name.$enc.afm
				[ -s ./$name.$enc.afm ] || {
					echo "$MYSELF: can't convert AFM file for $name.$enc" >&2
				}

				aliases=`echo "$DSTALIAS" | grep "^$enc" | cut -d\  -f2`
				echo "******* aliases: $aliases" >>$LOG

				$T1FDIR -d fonts.ttf fonts.alias $FOUNDRY $enc $aliases -f ./$name.$enc.$SUFFIX
				echo "/$psname$enc	($name.$enc.$SUFFIX)	;" >>Fontmap.ttf
			} done
		} else {
			enc="$SRCENC"
			echo "******* $name -> $enc ************" >>$LOG

			sed 's|^\/FontName.*$|/FontName '$psname$enc' def|' <./$name.$SRCENC.t1a \
				| $FORCEISO | $T1ASM >./$name.$enc.$SUFFIX
			[ -s ./$name.$enc.$SUFFIX ] || {
				echo "$MYSELF: can't convert/assemble Type1 file for $name.$enc" >&2
				continue;
			}

			sed 's|^FontName.*$|FontName '$psname$enc'|' <./$name.$SRCENC.xafm \
				| uniq | $FORCEISO >./$name.$enc.afm
			[ -s ./$name.$enc.afm ] || {
				echo "$MYSELF: can't convert AFM file for $name.$enc" >&2
			}

			$T1FDIR -d fonts.ttf fonts.alias $FOUNDRY $enc -f ./$name.$enc.$SUFFIX
			echo "/$psname$enc	($name.$enc.$SUFFIX)	;" >>Fontmap.ttf
		} fi

		[ YES = "$REMOVET1A" ] && {
			rm -f ./$name.$SRCENC.t1a
			rm -f ./$name.$SRCENC.xafm
		}

	} done
} done

wc -l <fonts.ttf >fonts.scale
cat fonts.ttf >>fonts.scale
mkfontdir

[ YES = "$GENUID" ] && {
	echo "Checking for duplicate UniqueIDs..."
	for id in `find . -name "*.$SUFFIX" -exec grep UniqueID {} \; \
			| cut -d" " -f2 | sort | uniq -d`
	do {
		echo "Warning: duplicate UniqueID $id in files:" | tee -a $LOG
		find  . -name "*.$SUFFIX" -exec grep -l "UniqueID $id " {} \; 2>&1 | tee -a $LOG
	} done
}

[ -n "$GSDIR" ] || {
	echo "$MYSELF: The Ghostscript base directory is not specified.\n" >&2
	echo "$MYSELF: Installation of the Ghostscript fonts is deferred.\n" >&2
	echo "$MYSELF: You can do it later by running x2gs\n" >&2
	exit 0
}

echo "Installing the Ghostscript fonts"
cd $RUNDIR
$X2GS $CFGFILE || {
	echo "$MYSELF: Installation of the Ghostscript fonts has failed.\n" >&2
	echo "$MYSELF: You can correct the problem and run x2gs to repeat\n" >&2
	exit 0
}
